package co.gov.medellin.ssti.sub.model.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcDaoSupport;

import co.gov.medellin.ssti.sub.model.dao.RepDetCruceDAO;
import co.gov.medellin.ssti.sub.model.vo.BeneficiarioVO;
import co.gov.medellin.ssti.sub.model.vo.RepDetCruceVO;

public class RepDetCruceDAOImpl2 extends NamedParameterJdbcDaoSupport implements
		RepDetCruceDAO {

	public Collection<BeneficiarioVO> findBeneficiariosCruce(
			RepDetCruceVO criteria) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "";

		if (!criteria.getDesde().equals("") && !criteria.getHasta().equals("")) {
			if (criteria.getCodeSubprogramaFuente() != null) {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = :codeSubprogramaFuente AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') "
								+ " INTERSECT "
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = :codeSubprogramaDestino AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy')";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());
						namedParameters.put("codeSubprogramaDestino",
								criteria.getCodeProgramaDestino());

					} else if (criteria.getCodeProgramaDestino() != null) {
						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = :codeSubprogramaFuente AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') "
								+ " INTERSECT "
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = subprograma.codigo AND "
								+ " subprograma.prg_codigo = :codeSubprogramaDestino AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy')";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());
						namedParameters.put("codeSubprogramaDestino",
								criteria.getCodeProgramaDestino());

					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO, programa.NOMBRE NOMBREPROGRAMA, subprograma.NOMBRE NOMBRESUBPROGRAMA "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, tcs_ben_programa programa, (SELECT distinct otorgado.ben_codigo codigoBene "
								+ "                           FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, tcs_ben_programa programa "
								+ "                           WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ "                                 otorgado.sbpr_codigo = subprograma.codigo AND "
								+ "                                 subprograma.codigo = :codeSubprogramaFuente AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy')) bene "
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = subprograma.codigo AND "
								+ " otorgado.ben_codigo = bene.codigoBene AND "
								+ " subprograma.prg_codigo = programa.codigo AND "
								+ " subprograma.codigo <> :codeSubprogramaFuente ";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());

					}
				} else if (criteria.getInclusion().equals("SoloFuente")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = :codeSubprogramaFuente AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') "
								+ " MINUS "
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = :codeSubprogramaDestino AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') ";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());
						namedParameters.put("codeSubprogramaDestino",
								criteria.getCodeSubprogramaDestino());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = :codeSubprogramaFuente AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') "
								+ " MINUS "
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = subprograma.codigo AND "
								+ " subprograma.prg_codigo = :codeProgramaDestino AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(?,'dd/mm/yyyy') AND TO_DATE(?,'dd/mm/yyyy') ";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());
						namedParameters.put("codeProgramaDestino",
								criteria.getCodeProgramaDestino());

					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO \n"
								+ " FROM tcs_ben_beneficiario beneficiario,tcs_ben_beneficio_otorgado otorgado \n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = :codeSubprogramaFuente AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') "
								+ " MINUS\n"
								+ " SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                           FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ "                           WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ "                                 otorgado.sbpr_codigo = :codeSubprogramaFuente "
								+ " AND\n"
								+ "                                 otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy')) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = :codeSubprogramaFuente AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());
					}
				}
			} else {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = :codeProgramaFuente AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') "
								+ " INTERSECT\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') AND "
								+ " otorgado.sbpr_codigo = :codeSubprogramaDestino ";

						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());
						namedParameters.put("codeSubprogramaDestino",
								criteria.getCodeSubprogramaDestino());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = :codeProgramaFuente AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') "
								+ " INTERSECT\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = :codeProgramaDestino AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy')";

						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());
						namedParameters.put("codeProgramaDestino",
								criteria.getCodeProgramaDestino());

					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE,"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO, programa.NOMBRE NOMBREPROGRAMA, subprograma.NOMBRE NOMBRESUBPROGRAMA "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_programa programa, \n"
								+ " tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, \n"
								+ "                           (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                                   FROM tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                                   WHERE otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                   otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') AND "
								+ "                                   subprograma.prg_codigo = :codeProgramaFuente) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo = programa.codigo AND\n"
								+ " subprograma.prg_codigo <> :codeProgramaFuente AND\n"
								+ " subprograma.prg_codigo = programa.codigo";

						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());
						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
					}
				} else if (criteria.getInclusion().equals("SoloFuente")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = :codeProgramaFuente AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') "
								+ " MINUS\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = :codeSubprogramaDestino AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy')";

						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
						namedParameters.put("codeSubprogramaDestino",
								criteria.getCodeSubprogramaDestino());
						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = :codeProgramaFuente AND "
								+ " otorgado.FECHA_BENEFICIO between to_date(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') "
								+ " MINUS\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = :codeProgramaDestino AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy')";

						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
						namedParameters.put("codeProgramaDestino",
								criteria.getCodeProgramaDestino());
						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());
					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO \n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = :codeProgramaFuente AND\n"
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') "
								+ " MINUS\n"
								+ " SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE,"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO \n"
								+ " FROM tcs_ben_beneficiario beneficiario,tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, \n"
								+ "                           (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                                   FROM tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                                   WHERE otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                   otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') AND "
								+ "                                   subprograma.prg_codigo = :codeProgramaFuente) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo <> :codeProgramaFuente ";

						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());

					}
				}
			}
		} else {
			if (criteria.getCodeSubprogramaFuente() != null) {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = :codeSubprogramaFuente "
								+ " INTERSECT\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = :codeSubprogramaDestino";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
						namedParameters.put("codeSubprogramaDestino",
								criteria.getCodeSubprogramaDestino());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = :codeSubprogramaFuente "
								+ " INTERSECT\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = :codeSubprogramaDestino";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
						namedParameters.put("codeSubprogramaDestino",
								criteria.getCodeProgramaDestino());
					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE,"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO, programa.NOMBRE NOMBREPROGRAMA, subprograma.NOMBRE NOMBRESUBPROGRAMA \n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, tcs_ben_programa programa, (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                           FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                           WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ "                                 otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                 subprograma.codigo = ?) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo = programa.codigo AND\n"
								+ " subprograma.codigo <> :codeSubprogramaFuente";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
					}
				} else if (criteria.getInclusion().equals("SoloFuente")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = :codeSubprogramaFuente "
								+ " MINUS\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = :codeSubprogramaDestino";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
						namedParameters.put("codeSubprogramaDestino",
								criteria.getCodeSubprogramaDestino());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = :codeSubprogramaFuente "
								+ " MINUS\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = :codeSubprogramaDestino";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
						namedParameters.put("codeSubprogramaDestino",
								criteria.getCodeProgramaDestino());
					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario,tcs_ben_beneficio_otorgado otorgado "
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = :codeSubprogramaFuente "
								+ " MINUS "
								+ " SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, (SELECT distinct otorgado.ben_codigo codigoBene "
								+ "                           FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado "
								+ "                           WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ "                                 otorgado.sbpr_codigo = :codeSubprogramaFuente) bene "
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo <> :codeSubprogramaFuente "
								+ " AND "
								+ " otorgado.ben_codigo = bene.codigoBene";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
					}
				}
			} else {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " subprograma.prg_codigo = :codeProgramaFuente "
								+ " INTERSECT\n"
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, \n"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO\n"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = :codeProgramaDestino";

						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
						namedParameters.put("codeProgramaDestino",
								criteria.getCodeProgramaDestino());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = subprograma.codigo AND "
								+ " subprograma.prg_codigo = :codeProgramaFuente "
								+ " INTERSECT "
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = subprograma.codigo AND "
								+ " subprograma.prg_codigo = :codeProgramaDestino";

						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
						namedParameters.put("codeProgramaDestino",
								criteria.getCodeProgramaDestino());
					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO, programa.NOMBRE NOMBREPROGRAMA, subprograma.NOMBRE NOMBRESUBPROGRAMA "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_programa programa, "
								+ " tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, "
								+ "                           (SELECT distinct otorgado.ben_codigo codigoBene "
								+ "                                   FROM tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma "
								+ "                                   WHERE otorgado.sbpr_codigo = subprograma.codigo AND "
								+ "                                   subprograma.prg_codigo = ?) bene "
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = subprograma.codigo AND "
								+ " otorgado.ben_codigo = bene.codigoBene AND "
								+ " subprograma.prg_codigo <> :codeProgramaFuente AND "
								+ " subprograma.prg_codigo = programa.codigo";

						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
					}
				} else if (criteria.getInclusion().equals("SoloFuente")) {
					if (criteria.getCodeSubprogramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = subprograma.codigo AND "
								+ " subprograma.prg_codigo = :codeProgramaFuente "
								+ " MINUS "
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = :codeSubprogramaDestino";

						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
						namedParameters.put("codeSubprogramaDestino",
								criteria.getCodeSubprogramaDestino());

					} else if (criteria.getCodeProgramaDestino() != null) {

						query = "SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = subprograma.codigo AND "
								+ " subprograma.prg_codigo = :codeProgramaFuente "
								+ " MINUS "
								+ " SELECT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma "
								+ " WHERE beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = subprograma.codigo AND "
								+ " subprograma.prg_codigo = :codeProgramaDestino";

						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
						namedParameters.put("codeProgramaDestino",
								criteria.getCodeProgramaDestino());
					} else {
						query = "SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE, "
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_programa programa, "
								+ " tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma "
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = subprograma.codigo AND "
								+ " subprograma.prg_codigo = :codeProgramaFuente "
								+ " MINUS "
								+ " SELECT DISTINCT  beneficiario.NUMERO_DOCUMENTO NUMERODOCUMENTO, beneficiario.TIPO_DOCUMENTO TIPODOCUMENTO, beneficiario.PRIMER_NOMBRE PRIMERNOMBRE,"
								+ " beneficiario.SEGUNDO_NOMBRE SEGUNDONOMBRE, beneficiario.PRIMER_APELLIDO PRIMERAPELLIDO, beneficiario.SEGUNDO_APELLIDO SEGUNDOAPELLIDO "
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_programa programa, "
								+ " tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, "
								+ "                           (SELECT distinct otorgado.ben_codigo codigoBene "
								+ "                                   FROM tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma "
								+ "                                   WHERE otorgado.sbpr_codigo = subprograma.codigo AND "
								+ "                                   subprograma.prg_codigo = :codeProgramaFuente) bene "
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND "
								+ " otorgado.sbpr_codigo = subprograma.codigo AND "
								+ " otorgado.ben_codigo = bene.codigoBene AND "
								+ " subprograma.prg_codigo <> :codeProgramaFuente";

						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());

					}
				}
			}
		}

		final Long codeProgramaDestino = criteria.getCodeProgramaDestino();
		final Long codeSubprogramaDestino = criteria
				.getCodeSubprogramaDestino();
		final String inclusion = criteria.getInclusion();

		List<BeneficiarioVO> beneficiarios = getNamedParameterJdbcTemplate()
				.query(query.toString(), namedParameters,
						new RowMapper<BeneficiarioVO>() {

							public BeneficiarioVO mapRow(ResultSet rst,
									int rowNum) throws SQLException {
								if (codeProgramaDestino == null
										&& codeSubprogramaDestino == null
										&& inclusion.equals("Ambos")) {

									BeneficiarioVO bene = new BeneficiarioVO();
									bene.setNumeroDocumento(rst
											.getString("NUMERODOCUMENTO"));
									bene.setTipoDocumento(rst
											.getString("TIPODOCUMENTO"));
									bene.setNombre1(rst
											.getString("PRIMERNOMBRE"));
									bene.setNombre2(rst
											.getString("SEGUNDONOMBRE"));
									bene.setPrimerApellido(rst
											.getString("PRIMERAPELLIDO"));
									bene.setSegundoApellido(rst
											.getString("SEGUNDOAPELLIDO"));
									bene.setPrograma(rst
											.getString("NOMBREPROGRAMA"));
									bene.setBeneficio(rst
											.getString("NOMBRESUBPROGRAMA"));
									return bene;

								} else {
									BeneficiarioVO bene = new BeneficiarioVO();
									bene.setNumeroDocumento(rst
											.getString("NUMERODOCUMENTO"));
									bene.setTipoDocumento(rst
											.getString("TIPODOCUMENTO"));
									bene.setNombre1(rst
											.getString("PRIMERNOMBRE"));
									bene.setNombre2(rst
											.getString("SEGUNDONOMBRE"));
									bene.setPrimerApellido(rst
											.getString("PRIMERAPELLIDO"));
									bene.setSegundoApellido(rst
											.getString("SEGUNDOAPELLIDO"));
									return bene;
								}
							}
						});
		return beneficiarios;
	}

	public Long findCantidadBeneficiarios(RepDetCruceVO criteria) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String query = "";

		if (!criteria.getDesde().equals("") && !criteria.getHasta().equals("")) {
			if (criteria.getCodeSubprogramaFuente() != null) {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() == null
							&& criteria.getCodeProgramaDestino() == null) {
						query = "SELECT COUNT(DISTINCT  beneficiario.CODIGO) CantidadBeneficiarios"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, tcs_ben_programa programa, (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                           FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, tcs_ben_programa programa\n"
								+ "                           WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ "                                 otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                 subprograma.codigo = :codeSubprogramaFuente AND "
								+ " otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy')) bene "
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo = programa.codigo AND\n"
								+ " subprograma.codigo <> :codeSubprogramaFuente";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());
					}
				}
			} else {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() == null
							&& criteria.getCodeProgramaDestino() == null) {
						query = "SELECT COUNT(DISTINCT  beneficiario.CODIGO) CantidadBeneficiarios"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_programa programa, \n"
								+ " tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, \n"
								+ "                           (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                                   FROM tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                                   WHERE otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                   otorgado.FECHA_BENEFICIO BETWEEN TO_DATE(:DESDE,'dd/mm/yyyy') AND TO_DATE(:HASTA,'dd/mm/yyyy') AND "
								+ "                                   subprograma.prg_codigo = :codeProgramaFuente) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo = programa.codigo AND\n"
								+ " subprograma.prg_codigo <> :codeProgramaFuente AND\n"
								+ " subprograma.prg_codigo = programa.codigo";

						namedParameters.put("DESDE", criteria.getDesde());
						namedParameters.put("HASTA", criteria.getHasta());
						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
					}
				}
			}
		} else {
			if (criteria.getCodeSubprogramaFuente() != null) {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() == null
							&& criteria.getCodeProgramaDestino() == null) {
						query = "SELECT COUNT(DISTINCT  beneficiario.CODIGO) CantidadBeneficiarios"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, tcs_ben_programa programa, (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                           FROM tcs_ben_beneficiario beneficiario, tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                           WHERE beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ "                                 otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                 subprograma.codigo = :codeSubprogramaFuente) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo = programa.codigo AND\n"
								+ " subprograma.codigo <> :codeSubprogramaFuente";

						namedParameters.put("codeSubprogramaFuente",
								criteria.getCodeSubprogramaFuente());
					}
				}
			} else {
				if (criteria.getInclusion().equals("Ambos")) {
					if (criteria.getCodeSubprogramaDestino() == null
							&& criteria.getCodeProgramaDestino() == null) {
						query = "SELECT COUNT(DISTINCT  beneficiario.CODIGO) CantidadBeneficiarios"
								+ " FROM tcs_ben_beneficiario beneficiario, tcs_ben_programa programa, \n"
								+ " tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma, \n"
								+ "                           (SELECT distinct otorgado.ben_codigo codigoBene\n"
								+ "                                   FROM tcs_ben_beneficio_otorgado otorgado, tcs_ben_subprograma subprograma\n"
								+ "                                   WHERE otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ "                                   subprograma.prg_codigo = :codeProgramaFuente) bene\n"
								+ " WHERE  beneficiario.codigo = otorgado.ben_codigo AND\n"
								+ " otorgado.sbpr_codigo = subprograma.codigo AND\n"
								+ " otorgado.ben_codigo = bene.codigoBene AND\n"
								+ " subprograma.prg_codigo <> :codeProgramaFuente AND\n"
								+ " subprograma.prg_codigo = programa.codigo";

						namedParameters.put("codeProgramaFuente",
								criteria.getCodeProgramaFuente());
					}
				}
			}
		}

		Long cantidad;
		cantidad = getNamedParameterJdbcTemplate().queryForObject(query,
				namedParameters, Long.class);
		return cantidad;

	}

	public RepDetCruceVO findFilters(RepDetCruceVO repDetCruceVO) {
		Map<String, Object> namedParameters = new HashMap<String, Object>();

		String strQuery = null;

		if (repDetCruceVO.getCodeProgramaFuente() != null) {
			strQuery = "SELECT NOMBRE FROM TCS_BEN_PROGRAMA WHERE CODIGO = :CODIGO";
			namedParameters
					.put("CODIGO", repDetCruceVO.getCodeProgramaFuente());

			String nombre = getNamedParameterJdbcTemplate().queryForObject(
					strQuery, namedParameters, String.class);
			repDetCruceVO.setNombreProgramaFuente(nombre);
			namedParameters.clear();
		}
		if (repDetCruceVO.getCodeSubprogramaFuente() != null) {
			strQuery = "SELECT NOMBRE FROM TCS_BEN_SUBPROGRAMA WHERE CODIGO = :CODIGO";
			namedParameters.put("CODIGO",
					repDetCruceVO.getCodeSubprogramaFuente());
			String nombre = getNamedParameterJdbcTemplate().queryForObject(
					strQuery, namedParameters, String.class);
			repDetCruceVO.setNombreSubprogramaFuente(nombre);
			namedParameters.clear();
		}
		if (repDetCruceVO.getCodeProgramaDestino() != null) {
			strQuery = "SELECT NOMBRE FROM TCS_BEN_PROGRAMA WHERE CODIGO = :CODIGO";
			namedParameters.put("CODIGO",
					repDetCruceVO.getCodeProgramaDestino());
			String nombre = getNamedParameterJdbcTemplate().queryForObject(
					strQuery, namedParameters, String.class);
			repDetCruceVO.setNombreProgramaDestino(nombre);
			namedParameters.clear();
		}
		if (repDetCruceVO.getCodeSubprogramaDestino() != null) {
			strQuery = "SELECT NOMBRE FROM TCS_BEN_SUBPROGRAMA WHERE CODIGO = :CODIGO";
			namedParameters.put("CODIGO",
					repDetCruceVO.getCodeSubprogramaDestino());
			String nombre = getNamedParameterJdbcTemplate().queryForObject(
					strQuery, namedParameters, String.class);
			repDetCruceVO.setNombreSubprogramaDestino(nombre);
		}
		return repDetCruceVO;
	}

}
